import os
import unittest
from time import sleep

from selenium.webdriver.common.keys import Keys

from common.functions import save_screenshot, read_excel, write_excel
from common.decorators import mkdir_classname, log4gs
from common.settings import TAG, DATA_DIR
from common.vue.select import DropDownSelect, OperateSelect
from pages_example.personListPage import PersonListPage


@log4gs
@mkdir_classname(TAG)
class PersonListTest(unittest.TestCase):
    """人口库管理功能测试"""
    @classmethod
    def setUpClass(cls):
        cls.log.info('=' * 30 + "开始人口库管理功能测试({})".format(__class__.__name__) + '=' * 30)
        cls.page = PersonListPage('/DataManage/PersonList')

    @classmethod
    def tearDownClass(cls):
        cls.log.info('=' * 30 + "结束人口库管理功能测试({})".format(__class__.__name__) + '=' * 30)
        cls.page.driver.quit()

    def setUp(self):
        self.log.info('>>>>>开始执行用例：{} {}'.format(self.id(), self.shortDescription()))

    def tearDown(self):
        self.log.info('<<<<<结束执行用例：{} {}'.format(self.id(), self.shortDescription()))

    @unittest.skip
    def test_page(self):
        """举例：翻页"""
        self.log.debug(self.page.turnPage.total_num)
        self.log.debug(self.page.turnPage.current_page)
        self.log.debug(self.page.turnPage.total_page)
        self.page.turnPage.next_page.click()
        sleep(1)
        self.page.turnPage.next_page.click()
        sleep(1)
        self.page.turnPage.prev_page.click()
        sleep(1)
        self.page.turnPage.input.clear()
        self.page.turnPage.input.send_keys(6)
        sleep(1)
        self.page.turnPage.input.send_keys(Keys.ENTER)
        sleep(2)


    def test_search_1(self):
        """http://181.181.0.87:8786/tc/detail/76-31/

        举例：利用subTest进行姓名、身份证、IMSI、手机号码查询
        """
        # 测试数据文件放在data/cases/<测试用例所在文件名称>/<测试用例名称> 下面
        dict_rows = read_excel('example.xlsx')
        results = []
        for i, row in enumerate(dict_rows):
            condition = row['搜索条件']
            input_ = row['搜索值']
            expectation = row['期望值']
            ### 利用subTest对这种只是输入数据不一样，步骤一样的用例，进行统一测试
            with self.subTest():
                self.log.info("用以下数据进行搜索测试：\n{}".format(row))
                DropDownSelect(self.page.searchTools.keyword_dropdown_list, condition)   # 关键字选择姓名
                self.page.searchTools.keyword_input.send_keys(input_)   # 输入关键字文本
                self.page.searchTools.search_btn.click()   # 点击检索按钮
                sleep(1)
                try:
                    result = self.page.table.get_row(expectation)
                    if not result:
                        raise Exception
                    self.assertTrue(result, msg="没有找到结果：{}".format(expectation))
                    self.log.info("用例'{}'执行成功".format(self.id()))
                    results.append('true')
                except Exception:
                    self.log.error("用例'{}'执行失败,".format(self.id()), exc_info=True)
                    results.append('false')
                self.page.searchTools.reset_btn.click()  # 点击重置按钮
                sleep(1)
        write_excel('example.xlsx', results)

    @unittest.skip
    def test_search_2(self):
        """标签查询"""
        DropDownSelect(self.page.searchTools.keyword_dropdown_list, "标签")
        DropDownSelect(self.page.searchTools.tag_dropdown_list, "吸毒人员")
        self.page.searchTools.search_btn.click()  # 点击检索按钮
        sleep(1)
        result = self.page.table.get_row("扎西")
        self.assertTrue(result, "通过标签:吸毒人员查询到了扎西")
        self.page.searchTools.reset_btn.click()  # 点击重置按钮
        sleep(1)
        save_screenshot(self, "截图示例")
        sleep(1)

    @unittest.skip
    def test_search_3(self):
        """区域、小区查询"""
        DropDownSelect(self.page.searchTools.region_dropdown_list, "区域")
        self.page.searchTools.region_region_input.click()
        sleep(1)
        self.page.searchTools.region_region_selector.select("浙江省-杭州市-江干区")
        DropDownSelect(self.page.searchTools.community_dropdown_list, "勿动梦琴湾")
        self.page.searchTools.search_btn.click()  # 点击检索按钮
        sleep(1)
        result = self.page.table.get_row("吴振杰")
        self.assertTrue(result, "通过区域:浙江省-杭州市-江干区，小区：勿动梦琴湾查询到了吴振杰")
        self.page.searchTools.reset_btn.click()  # 点击重置按钮
        sleep(1)

    @unittest.skip
    def test_search_4(self):
        """网格查询"""
        DropDownSelect(self.page.searchTools.region_dropdown_list, "网格")
        self.page.searchTools.region_grid_input.click()
        sleep(1)
        self.page.searchTools.region_grid_selector.select("江西省-太原市网格")
        sleep(2)
        self.page.searchTools.search_btn.click()  # 点击检索按钮
        sleep(1)
        result = self.page.table.get_row("彭伟02")
        self.assertTrue(result, "通过网格:江西省-太原市网格查询到了彭伟02")
        self.page.searchTools.reset_btn.click()  # 点击重置按钮
        sleep(1)

    @unittest.skip
    def test_add_person(self):
        """添加人员"""
        self.page.table.add_btn.click()
        sleep(1)  # 等待弹窗完全出来
        self.page.addPerson.name.send_keys("小明明1")
        DropDownSelect(self.page.addPerson.gender, "男")
        self.page.addPerson.id_.send_keys("362522188012171512")

        self.page.addPerson.region.click()
        self.page.addPerson.region_selector.select("江西省-南昌市-高新区")
        self.page.addPerson.region.click()   # 收起区域选择器

        sleep(1)   # 等待区域选择器收起完毕
        self.page.addPerson.grid.click()
        self.page.addPerson.grid_selector.select("江西省-南昌市-高新区-昌东镇-山湖村-西1组")
        self.page.addPerson.name.click()   # 收起网格选择器，这里前端代码不规范，当选择了网格后，下拉箭头没有了，导致不能通过再点下拉箭头收回，只能借助点击其他元素收回

        sleep(1)  # 等待网格选择器收起完毕
        self.page.addPerson.confirm.click()
        ### 检查是否加成功
        sleep(1)  # 等待弹窗消失完毕
        DropDownSelect(self.page.searchTools.keyword_dropdown_list, "姓名")  # 关键字选择姓名
        self.page.searchTools.keyword_input.send_keys("小明明1")  # 关键字输入包旗
        self.page.searchTools.search_btn.click()  # 点击检索按钮
        sleep(1)
        result = self.page.table.get_row("小明明1")
        self.assertTrue(result, "通过姓名:小明明1查询到了小明明1")
        self.page.searchTools.reset_btn.click()  # 点击重置按钮
        sleep(1)

    @unittest.skip
    def test_modify_person(self):
        """修改人员"""
        DropDownSelect(self.page.searchTools.keyword_dropdown_list, "姓名")  # 关键字选择姓名
        self.page.searchTools.keyword_input.send_keys("小明明13")  # 关键字输入包旗
        self.page.searchTools.search_btn.click()  # 点击检索按钮
        sleep(1)
        result = self.page.table.get_row("小明明12")

        OperateSelect(result, "编辑")

        sleep(1)   # 等待弹窗完全出来
        self.page.modifyPerson.name.clear()
        self.page.modifyPerson.name.send_keys("小明明12")
        DropDownSelect(self.page.modifyPerson.gender, "女")
        self.page.modifyPerson.date.clear()
        sleep(3)
        self.page.modifyPerson.date.send_keys('1993-12-17')
        sleep(3)
        self.page.modifyPerson.confirm.click()

        sleep(1)  # 等待弹窗消失完毕
        self.page.searchTools.reset_btn.click()
        DropDownSelect(self.page.searchTools.keyword_dropdown_list, "姓名")  # 关键字选择姓名
        self.page.searchTools.keyword_input.send_keys("小明明12")  # 关键字输入包旗
        self.page.searchTools.search_btn.click()  # 点击检索按钮
        sleep(1)
        result = self.page.table.get_row("小明明12")
        self.assertTrue(result, "通过姓名:小明明12查询到了小明明12")
        self.page.searchTools.reset_btn.click()  # 点击重置按钮
        sleep(1)

    @unittest.skip
    def test_upload(self):
        """上传文件和VueElement举例，并删除已选的图片"""
        self.page.table.add_btn.click()
        self.page.addPerson.face_pic.send_keys(os.path.join(DATA_DIR, "测试人脸1.jpg"))
        self.page.addPerson.face_pic.clear()
        sleep(1)
        self.page.addPerson.face_pic.send_keys(os.path.join(DATA_DIR, "测试人脸2.jpg"))
        self.page.addPerson.flag_info.click()
        sleep(1)
        self.page.addPerson.imsi.send_keys('123456789')
        self.page.addPerson.add_imsi_btn.click()
        sleep(1)

    @unittest.skip
    def test_clear(self):
        """举例：清除网格、小区、区域"""

        # 清空已选的网格（ElementType.GRID）
        DropDownSelect(self.page.searchTools.region_dropdown_list, "网格")
        self.page.searchTools.region_grid_input.click()
        self.page.searchTools.region_grid_selector.select("江西省-太原市网格")
        self.page.searchTools.region_grid_input.clear()
        # sleep(1)

        # 清空已选的小区（ElementType.DROPDOWN_LIST）、区域（ElementType.REGION）
        DropDownSelect(self.page.searchTools.region_dropdown_list, "区域")
        self.page.searchTools.region_region_input.click()
        self.page.searchTools.region_region_selector.select("山西省-太原市-小店区")
        DropDownSelect(self.page.searchTools.community_dropdown_list, "太原兴达小区")
        self.page.searchTools.community_dropdown_list.clear()
        sleep(1)
        self.page.searchTools.region_region_input.clear()
        sleep(1)

    @unittest.skip
    def test_msg(self):
        """举例：只拿msg、warning_msg、has_masg、is_warning举例，其他一样"""
        self.page.table.add_btn.click()
        self.page.addPerson.flag_info.click()
        self.page.addPerson.add_imsi_btn.click()
        self.page.addPerson.add_imsi_btn.click()
        self.page.addPerson.add_imsi_btn.click()
        self.page.addPerson.add_imsi_btn.click()
        self.page.addPerson.add_imsi_btn.click()
        sleep(1)

        self.log.debug(self.page.message.is_warning())
        self.log.debug(self.page.message.warning_msg)
        self.log.debug(self.page.message.has_msg())
        self.log.debug(self.page.message.msg)

    @unittest.skip
    def test_operate(self):
        """修改人员"""
        DropDownSelect(self.page.searchTools.keyword_dropdown_list, "姓名")  # 关键字选择姓名
        self.page.searchTools.keyword_input.send_keys("金湖1")  # 关键字输入包旗
        self.page.searchTools.search_btn.click()  # 点击检索按钮
        sleep(1)
        result = self.page.table.get_row("金湖1")

        OperateSelect(result, "编辑")
        sleep(3)


if __name__ == '__main__':
    unittest.main()